Многие программисты сломали зубы об эту модель, а некоторые программисты, эти, свои поломанные зубы, так и не починили...
А все очень просто:
1. Старт программы 2. Начальные установки 3. Определение системного меню --> Главное меню программы 4. READ EVENTS Команда меню 1 --> процедура (функция) Команда меню 2 --> процедура (функция) Команда меню 3 --> процедура (функция) Команда меню 4 --> процедура (функция) Команда меню 5 --> процедура (функция) Команда меню 6 --> процедура (функция) 3. CLEAR EVENTS <-- Команда меню Exit (Выход) 2. Завершающие установки 1.Выход из программы
И вся модель !!! После определения меню мы "завешиваем" систему. На команды меню "цепляем" наши процедуры и функции. Получаем нелинейную структуру, которая, кроме всего прочего, легко наращивается и дополняется. Просто добавляем пункт меню и вызов новой процедуры.
Очень важно не забыть пункт меню, вызывающий процедуру с командой CLEAR EVENTS. Иначе наше приложение придется снимать диспетчером задач вместе с FoxPro.
А теперь завершим создавать "скелет" нашего приложения. Добавим в проект файл DefineMenu.prg. Не забудем расположить его в папке Programs(не путать с закладкой Programs).
*
* function DefineMenu
*
* отключаем системное меню VFP
set sysmenu off
* переопределяем системное меню VFP
define menu _MSYSMENU bar in screen
* определяем горизонтальную строчку меню
define pad PADFILE of _MSYSMENU prompt "Файл"
define pad PADEDIT of _MSYSMENU prompt "Правка"
define pad PADWIN of _MSYSMENU prompt "Окно"
define pad PADHELP of _MSYSMENU prompt "Помощь"
* определяем вызовы вертикальных меню
on pad PADFILE of _MSYSMENU activate popup POPFILE
on pad PADEDIT of _MSYSMENU activate popup POPEDIT
on pad PADWIN of _MSYSMENU activate popup POPWIN
on pad PADHELP of _MSYSMENU activate popup POPHELP
* определяем меню ФАЙЛ
define popup POPFILE margin relative
define bar 1 of POPFILE prompt "Новый..."
define bar 2 of POPFILE prompt "Открыть..."
define bar 3 of POPFILE prompt "\-"
define bar 4 of POPFILE prompt "Выход"
* определяем вызовы процедур для пунктов меню
on selection bar 1 of POPFILE do PopFileNew
on selection bar 2 of POPFILE do PopFileOpen
on selection bar 4 of POPFILE do PopFileExit
*
* И так далее, пока раджа не крикнет "ДОВОЛЬНО!!!" ("Золотая антилопа").
*
* активизируем наше меню
set sysmenu automatic
* конец процедуры
return
*Добавляем в проект файл PopFileExit
*
* function PopFileExit
*
CLEAR EVENTS
return
*Добавляем в проект файлы PopFileNew и PopFileOpen
*
* function PopFileNew
*
getfile()
*
return
*В главный модуль приложения MyMain добавляем несколько строк
* вызов процедуры определения меню
DefineMenu()
* обработчик событий
READ EVENTS
* восстановление системного меню VFP
set sysmenu to default
* конец процедуры
return
*
Можно сохранять код и запускать приложение. Подсвечиваем курсором MyMain и нажимаем кнопку Run. Приложение успешно "висит" и выйти из него можно только выбрав команду Выход в меню Файл.
Несколько замечаний по поводу программирования на VFP. Если программный код расположен в отдельном файле, то для вызова используется имя файла. Строчка function NameFunction не нужна или должна быть закоментирована символом *. Много маленьких процедур можно собрать в главном модуле:
* * главный модуль * .................................. * READ EVENTS * ................................. * * конец главного модуля * return * function MyFunction1 return * function MyFunction2 return *Функции в главном модуле приложения VFP находит сам. Если несколько функций собрано по смыслу в нескольких процедурных файлах необходимо использовать следующую команду:
Do MyFunction in MyProcedureFileТеперь об интерфейсе. Существуют стандарты, которых следует придерживаться. Первыми в главном меню программы всегда следуют пункты Файл (File) и Правка (Edit), последними - Окно (Window) и Помощь (Help). Между ними программист может создавать свою функциональность. Приятно всегда найти выход из программы в меню Файл последним пунктом, а не в другом месте.
А если пункт меню заканчивается многоточием (...), то следует ожидать появление диалогового окна.
Предлагаю самостоятельно посмотреть в документации вопросы определения "горячих клавиш" и создания сообщений для меню.